home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / fb386 / vlist / vlist.bas next >
BASIC Source File  |  1991-10-18  |  5KB  |  137 lines

  1. 100 ' --- 変数表作成ユーティリティ vlist.bas  Ver. 1.0  '91.04.28 ---
  2. 110 ' copyright(c)1991 handle name : 黒崎 黒作 , NIFTY ID : NAG01365
  3. 120 '
  4. 130 ' バイナリ形式でセーブしたF-BASIC386のプログラムを読み込み、変数と
  5. 140 ' その変数の使用行番号の一覧表を作成します。詳細は VLIST.DOCを参照
  6. 150 ' してください。
  7. 160 '
  8. 170 SCREEN@ 0 : WIDTH 80,25 : PALETTE : COLOR 7,0 : CLS
  9. 180 DEFINT A-Z : VLMT=500 : LLMT=30000   '変数&行番号格納領域の上限
  10. 190 DIM VM$(5),CMD(&H1F),V$(VLMT),P(VLMT),L(LLMT)
  11. 200 FOR I=0 TO 5 : READ VM$(I) : NEXT    '変数の種別用
  12. 210 DATA "","%","&","!","#","$"
  13. 220 FOR I=0 TO &H1F : READ CMD(I) : NEXT '中間コード00~1Fの処理番号
  14. 230 DATA 6,1,1,6,6,2,2,3,0,4,4,4,4,4,4,6
  15. 240 DATA 6,2,2,7,8,10,10,14,2,0,0,10,0,5,0,7
  16. 250 M1$="変数登録領域が足りません"
  17. 260 M2$="行番号登録領域が足りません"
  18. 270 M3$="要素だけ増やしてください"
  19. 280 M4$="未定義の中間コードがあります"
  20. 290 ON ERROR GOTO *エラー
  21. 300 '
  22. 310 *FILE名入力
  23. 320 LINE INPUT "file name [.BASは不要][.で終了] ";F1$
  24. 330 IF F1$="." THEN END
  25. 340 F$=F1$+".BAS" : ER=1 : OPEN"I",#1,F$ : CLOSE #1 '存在するかの検査
  26. 350 OPEN"R",#1,"(1)"+F$ : N&=LOF(1) : CLOSE #1      'ファイルサイズ
  27. 360 DIM D(N& \ 2) : LOAD@ F$,D : A&=VARPTR(D(0))    '配列に取り込み
  28. 370 VMAX=0 : LMAX=1 : C1=0 : C2=0 : C3=0
  29. 380 '
  30. 390 GOSUB *L_GET : A&=A&+8
  31. 400 IF D&<>-1 THEN PRINT"バイナリ形式じゃない":ERASE D:GOTO *FILE名入力
  32. 410 PRINT"結果をファイルに出力しますか?[Y/N]"
  33. 420 Y=INSTR("YyNn",INPUT$(1)) : IF Y=0 THEN 410
  34. 430 F1=(Y<=2)
  35. 440 '
  36. 450 *MAIN
  37. 460 GOSUB *W_GET : NX&=D& : NX1&=A&+NX&-2 '次行のアドレス
  38. 470 IF NX&=0 THEN ERASE D : GOSUB *変数表示 : GOTO *FILE名入力
  39. 480 GOSUB *W_GET : IF D&>32767 THEN D&=D&-65536 '符号付整数にして保存
  40. 490 LNUM=D& : PRINT "行番号 ";D&
  41. 500 IF NX&>256 THEN PRINT "ポインタ異常" : END
  42. 510 *MAIN2
  43. 520 IF A&<NX1& THEN GOSUB *解析 : GOTO *MAIN2
  44. 530 GOTO *MAIN
  45. 540 '
  46. 550 *変数表示
  47. 560 IF F1 THEN ER=2 : OPEN"O",#1,F1$+".VAR"
  48. 570 M$="FILE NAME : "+F1$+".BAS" : GOSUB *ファイル出力
  49. 580 IF C1>0 THEN M$=M1$+STR$(C1*2)+M3$ : GOSUB *ファイル出力
  50. 590 IF C2>0 THEN M$=M2$+STR$(C2*2)+M3$ : GOSUB *ファイル出力
  51. 600 IF C3>0 THEN M$=M4$+STR$(C3)       : GOSUB *ファイル出力
  52. 610 IF VMAX=0 THEN *表示3                '変数未使用時
  53. 620 IF VMAX>1 THEN GOSUB *ソート
  54. 630 FOR I=0 TO VMAX-1
  55. 640  M$="<<< "+V$(I)+" >>>" : LK=P(I) : GOSUB *ファイル出力
  56. 650  *表示2 
  57. 660  LNUM&=L(LK-1) : IF LNUM&<0 THEN LNUM&=LNUM&+65536
  58. 670  L$=STR$(LNUM&) : PRINT L$; : IF F1 THEN PRINT #1,L$;
  59. 680  IF L(LK)>0 THEN LK=L(LK) : GOTO *表示2
  60. 690  PRINT : IF F1 THEN PRINT #1
  61. 700 NEXT
  62. 710 *表示3
  63. 720 IF F1 THEN CLOSE #1
  64. 730 RETURN
  65. 740 '
  66. 750 *ファイル出力
  67. 760 PRINT M$ : IF F1 THEN PRINT #1,M$
  68. 770 RETURN
  69. 780 '
  70. 790 *ソート
  71. 800 PRINT "ソート中 ";
  72. 810 FOR I=0 TO VMAX-2
  73. 820  V$=V$(I) : K=I :PRINT "+";
  74. 830  FOR J=I+1 TO VMAX-1
  75. 840   IF V$>V$(J) THEN V$=V$(J) : K=J
  76. 850  NEXT
  77. 860  IF K<>I THEN SWAP V$(I),V$(K) : SWAP P(I),P(K)
  78. 870 NEXT
  79. 880 PRINT : RETURN
  80. 890 '
  81. 900 *解析
  82. 910 C=PEEK(A&) : A&=A&+1
  83. 920 IF C>=&HFE THEN A&=A&+1 : RETURN
  84. 930 IF C>=&H20 THEN RETURN
  85. 940 CMD=CMD(C) : IF CMD=0 THEN PRINT " 未定義" : C3=C3+1 : RETURN
  86. 950 IF CMD>5 THEN A&=A&+CMD-6 : RETURN
  87. 960 ON CMD GOSUB *S_REM,*S_SKIP,*S_ARRY,*S_VAR,*S_LAB
  88. 970 RETURN
  89. 980 '
  90. 990 *S_REM '注釈
  91. 1000 A&=NX1&-1 : RETURN
  92. 1010 *S_ARRY '配列変数
  93. 1020 VF=1 : GOSUB *B_GET : C=D& : GOTO *S_VAR2
  94. 1030 *S_VAR '変数
  95. 1040 VF=0
  96. 1050 *S_VAR2
  97. 1060 GOSUB *S_GET : V$=V$+VM$(C-9) : IF VF=1 THEN V$=V$+"()"
  98. 1070 GOSUB *変数登録 : RETURN
  99. 1080 *S_LAB 'ラベル
  100. 1090 A&=A&+4 : GOSUB *S_SKIP : RETURN
  101. 1100 '
  102. 1110 *B_GET '1バイト読出
  103. 1120 D&=PEEK(A&) : A&=A&+1 : RETURN
  104. 1130 *W_GET '1ワード読出
  105. 1140 D&=PEEK(A&,2) : A&=A&+2 : RETURN
  106. 1150 *L_GET '1ロングワード読出
  107. 1160 D&=PEEK(A&,4) : A&=A&+4 : RETURN
  108. 1170 *S_GET '文字列読出
  109. 1180 GOSUB *B_GET : IF D&=0 THEN RETURN
  110. 1190 N=D& : V$=""
  111. 1200 FOR I=1 TO N
  112. 1210  D&=PEEK(A&) : A&=A&+1 : IF D&>0 THEN V$=V$+CHR$(D&)
  113. 1220 NEXT : RETURN
  114. 1230 *S_SKIP '文字列読み飛ばし
  115. 1240 GOSUB *B_GET : A&=A&+D& : RETURN
  116. 1250 '
  117. 1260 *変数登録
  118. 1270 PRINT V$
  119. 1280 IF VMAX>VLMT THEN PRINT M1$ : C1=C1+1 :RETURN
  120. 1290 IF LMAX+1>LLMT THEN PRINT M2$ : C2=C2+1 : RETURN
  121. 1300 IF VMAX=0 THEN *登録2
  122. 1310 FOR J=0 TO VMAX-1           'VMAX,LMAXは次の登録位置を指す
  123. 1320  IF V$=V$(J) THEN LK=P(J) : GOTO *登録3
  124. 1330 NEXT
  125. 1340 *登録2
  126. 1350 V$(VMAX)=V$ : P(VMAX)=LMAX : VMAX=VMAX+1 '変数とLへのポインタの格納
  127. 1360 L(LMAX)=0 : L(LMAX-1)=LNUM : LMAX=LMAX+2 : RETURN '終端と行番号
  128. 1370 '
  129. 1380 *登録3
  130. 1390 IF L(LK)>0 THEN LK=L(LK) : GOTO *登録3 
  131. 1400 L(LK)=LMAX : L(LMAX)=0 : L(LMAX-1)=LNUM : LMAX=LMAX+2 : RETURN
  132. 1410 '
  133. 1420 *エラー
  134. 1430 IF ER=1 THEN PRINT "そのファイルはありません" : RESUME *FILE名入力
  135. 1440 IF ER=2 THEN PRINT F1$+".VAR に上書きします":KILL F1$+".VAR":RESUME 
  136. 1450 PRINT ERL;"行  エラー番号";ERR
  137.